package com.lzs.adx.web.commmon.utils;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;

public class BigDecimalUtil implements Serializable {

    // 默认精度
    private static final int DEFAULT_SCALE = 2;

    // 私有构造方法，防止实例化
    private BigDecimalUtil() {}

    // 加法
    public static BigDecimal add(BigDecimal a, BigDecimal b) {
        a = (a == null) ? BigDecimal.ZERO : a;
        b = (b == null) ? BigDecimal.ZERO : b;
        return a.add(b);
    }

    // 减法
    public static BigDecimal subtract(BigDecimal a, BigDecimal b) {
        a = (a == null) ? BigDecimal.ZERO : a;
        b = (b == null) ? BigDecimal.ZERO : b;
        return a.subtract(b);
    }

    // 乘法
    public static BigDecimal multiply(BigDecimal a, BigDecimal b) {
        a = (a == null) ? BigDecimal.ZERO : a;
        b = (b == null) ? BigDecimal.ZERO : b;
        return a.multiply(b);
    }

    // 除法，默认保留两位小数，四舍五入
    public static BigDecimal divide(BigDecimal a, BigDecimal b) {
        return divide(a, b, DEFAULT_SCALE);
    }

    // 除法，指定精度，四舍五入
    public static BigDecimal divide(BigDecimal a, BigDecimal b, int scale) {
        a = (a == null) ? BigDecimal.ZERO : a;
        b = (b == null) ? BigDecimal.ONE : b; // 避免除以零
        if (BigDecimal.ZERO.compareTo(b) == 0) {
            throw new ArithmeticException("除数不能为零");
        }
        return a.divide(b, scale, RoundingMode.HALF_UP);
    }

    // 比较大小
    public static int compare(BigDecimal a, BigDecimal b) {
        a = (a == null) ? BigDecimal.ZERO : a;
        b = (b == null) ? BigDecimal.ZERO : b;
        return a.compareTo(b);
    }

    // 判断是否为零
    public static boolean isZero(BigDecimal a) {
        a = (a == null) ? BigDecimal.ZERO : a;
        return BigDecimal.ZERO.compareTo(a) == 0;
    }

    // 判断是否为正数
    public static boolean isPositive(BigDecimal a) {
        a = (a == null) ? BigDecimal.ZERO : a;
        return a.compareTo(BigDecimal.ZERO) > 0;
    }

    // 判断是否为负数
    public static boolean isNegative(BigDecimal a) {
        a = (a == null) ? BigDecimal.ZERO : a;
        return a.compareTo(BigDecimal.ZERO) < 0;
    }

}
